The functionality of a software application may be extended by a developer by code which is defined as part of the software before the software runs. For instance, software development often includes writing source code, compiling the source into executable machine code or virtual machine code, and linking or otherwise binding the compiled result to previously created code. Such extensions occur at compile-time.
Some architectures allow the functionality of an application to be extended while an end-user is running the application. For example, some applications support plug-ins, which are relatively small pieces of application-specific software that can be loaded by (or on behalf of) an application at runtime. Plug-ins enhance an application, rather than running on their own. Plug-ins are optional, in that the application provides substantial functionality even without plug-ins. Plug-ins are application-specific, being designed and implemented to operate with a particular application, and sometimes even with a particular version of that application. Each application provides its own infrastructure for locating and using the plug-in(s) it supports.
A managed extensibility framework allows an application to both give and receive software functionality, at runtime, in an infrastructure that supports sharing functionality among different applications, as well as application-specific extensions. Such applications are termed “extensible”. The managed extensibility framework's infrastructure provides mechanisms for an application to locate and load available extensions, based on signatures and/or other data type information associated with the extensions and the applications.